#ifndef HTTPS_CLIENT_H
#define HTTPS_CLIENT_H

#include "esp_http_client.h"
#include "esp_timer.h"
#include "esp_tls.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include <string>
#include <functional>
#include <vector>

/**
 * @brief 🔗 HTTPS客户端类 - 与服务器进行HTTP通信
 * 
 * 这个类封装了HTTPS协议，让ESP32能够作为客户端与服务器进行HTTP通信。
 * 
 * 🎯 主要特点：
 * - 支持GET和POST请求
 * - 支持HTTPS安全连接
 * - 支持JSON和二进制数据POST
 * - 响应回调机制
 * 
 * 📡 应用场景：
 * - 发送设备状态到服务器
 * - 获取配置信息
 * - 上传音频数据
 */
class HttpsClient {
public:
    /**
     * @brief HTTP事件类型
     */
    enum class EventType {
        CONNECTED,      // 🔗 连接成功
        DISCONNECTED,   // 🔌 连接断开
        DATA_RECEIVED,  // 📥 收到响应数据
        ERROR           // ❌ 发生错误
    };
    
    /**
     * @brief HTTP事件数据结构
     */
    struct EventData {
        EventType type;         // 事件类型
        const uint8_t* data;    // 数据指针
        size_t data_len;        // 数据长度
        int status_code;        // HTTP状态码
        std::string url;        // 请求URL
    };
    
    /**
     * @brief 事件回调函数类型
     */
    using EventCallback = std::function<void(const EventData&)>;
    
    /**
     * @brief 创建HTTPS客户端
     * 
     * @param base_url 服务器基础URL (如 https://api.example.com)
     */
    explicit HttpsClient(const std::string& base_url);
    
    /**
     * @brief 析构函数
     */
    ~HttpsClient();
    
    /**
     * @brief 设置事件处理函数
     */
    void setEventCallback(EventCallback callback);
    
    /**
     * @brief 发送GET请求
     * 
     * @param path 请求路径 (如 /api/status)
     * @param timeout_ms 超时时间(毫秒)
     * @return ESP_OK=成功，其他=失败
     */
    esp_err_t get(const std::string& path, int timeout_ms = 10000);
    
    /**
     * @brief 发送POST请求(JSON数据)
     * 
     * @param path 请求路径
     * @param json_data JSON字符串
     * @param timeout_ms 超时时间(毫秒)
     * @return ESP_OK=成功，其他=失败
     */
    esp_err_t postJson(const std::string& path, const std::string& json_data, 
                      int timeout_ms = 10000);
    
    /**
     * @brief 发送POST请求(二进制数据)
     * 
     * @param path 请求路径
     * @param data 二进制数据指针
     * @param len 数据长度
     * @param timeout_ms 超时时间(毫秒)
     * @return ESP_OK=成功，其他=失败
     */
    esp_err_t postBinary(const std::string& path, const uint8_t* data, size_t len,
                        int timeout_ms = 10000);
    
    /**
     * @brief 发送POST请求(音频数据)
     * 
     * @param path 请求路径
     * @param data 原始音频数据指针
     * @param len 数据长度
     * @param timeout_ms 超时时间(毫秒)
     * @return ESP_OK=成功，其他=失败
     */
    esp_err_t postAudioData(const std::string& path, const uint8_t* data, size_t len,
                          int timeout_ms = 10000);
    
    /**
     * @brief 查询连接状态
     */
    bool isConnected() const { return connected_; }

private:
    // HTTP事件处理器
    static esp_err_t http_event_handler(esp_http_client_event_t* event);
    
    // 配置参数
    std::string base_url_;
    
    // HTTP客户端句柄
    esp_http_client_handle_t client_;
    
    // 状态变量
    bool connected_;
    
    // 事件回调
    EventCallback event_callback_;
    
    // 内部常量
    static constexpr int BUFFER_SIZE = 64*1024;  // 数据缓冲区大小
};

#endif // HTTPS_CLIENT_H
